package Execute.MiniSQL.module;

import Execute.MiniSQL.TableManager;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

public class Create {
    public String tableName;    // 表名
    public List<String[]> list; // 表结构

    public Create(String tableName, List<String[]> list) {
        this.tableName = tableName;
        this.list = list;

        // 执行创建数据表(需先检查列数据类型是否合法)
        if(isLegal()) {
            execute();
        }
    }

    public boolean isLegal() {
        for(String[] l : list) {
            if(l[1].equals("int") | l[1].equals("decimal") | l[1].startsWith("varchar")) continue;
            else {
                System.out.println(l[0] + " 列：未知的数据类型：" + l[1] + "。支持int/decimal/varchar(int)");
                return false;
            }
        }
        return true;
    }

    /*
    * 将数据表结构信息写入文件TableInfo.ti
    * */
    public void addTableInfo() {
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(TableManager.tableInfo, true);
            outputStream.write((tableName + " ").getBytes());
            outputStream.flush();
            int i = 0;
            for(String[] l : list) {
                if(i != list.size()-1) {
                    outputStream.write((l[0] + " " + l[1] + " ").getBytes());
                    i++;
                }
                else {
                    outputStream.write((l[0] + " " + l[1] + ",").getBytes());
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }

    }

    /*
    * 创建数据表
    * 1、将数据表结构信息写入文件TableInfo.ti    varchar(a)占 3a个字节
    * 2、表名加入程序内的tableNameStr列表
    * 3、创建数据表文件 tableName.midb
    * */
    public void execute() {
        addTableInfo();
        TableManager.tableNameStr.add(tableName);
        createmiDB();
    }

    /*
     * 创建.midb文件
     */
    public void createmiDB() {
        String path = TableManager.DATA_PATH + "/" + tableName + ".midb";
        File tabledata = new File(path);
        if(!tabledata.exists()) {
            try {
                tabledata.createNewFile();
                System.out.println("创建数据表 " + tableName + " 成功! ");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
